/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package JPA;

import DAO.UsuarioDAO;
import domain.Entity.EntityDireccion;
import domain.Entity.EntityGestor;
import domain.Entity.EntityPerfil;
import domain.Entity.EntityProyecto;
import domain.Entity.EntityTarea;
import domain.Entity.EntityTareaTrabajada;
import domain.Entity.EntityTrabajador;
import domain.Entity.EntityUsuario;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.UserTransaction;



/**
 *
 * @author jorge
 */
public class JPAUsuarioDAO implements UsuarioDAO {
    
    

    public EntityUsuario obtenerUsuario(String nombre) {
      EntityUsuario eu = new EntityUsuario();
       try {
            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            
            Query q = em.createQuery("SELECT u FROM EntityUsuario u WHERE u.nombre = :nombre");
            q = q.setParameter("nombre", nombre);
            List resultado = q.getResultList();
            if(resultado.size() > 0){
                
                  eu = (EntityUsuario) resultado.remove(0);
                
            }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return eu;
    }
    
     public void anadirGestor(EntityGestor eg) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            em.persist(eg);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

    public void anadirTrabajador(EntityTrabajador et) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityGestor eg = em.find(domain.Entity.EntityGestor.class, et.getEg().getDni());
            eg.getEtr().add(et);
            em.persist(et);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
    
     public List TrabajadoresGestor(Long dni) {
     List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT t FROM EntityTrabajador t WHERE t.eg.dni = :dni");
            q = q.setParameter("dni", dni);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }
     
    public EntityTrabajador borrarTrabajador(Long dni) {
        EntityTrabajador et = new EntityTrabajador();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            et = em.find(domain.Entity.EntityTrabajador.class, dni);
            em.remove(et);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return et;
     }

    public EntityTrabajador obtenerTrabajador(long dni) {
        EntityTrabajador et = new EntityTrabajador();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            et = em.find(domain.Entity.EntityTrabajador.class, dni);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return et; 
    }

    public EntityGestor obtenerGestor(long dni) {
        EntityGestor eg = new EntityGestor();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            eg = em.find(domain.Entity.EntityGestor.class, dni);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return eg; 
    }
    
    public EntityPerfil obtenerPerfil(long dni) {
           EntityPerfil ep = new EntityPerfil();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT perfil FROM EntityPerfil perfil WHERE perfil.eu.dni = :dni");
            q = q.setParameter("dni", dni);
            List resultado = q.getResultList();
            if(resultado.size() > 0){
                
                  ep = (EntityPerfil) resultado.remove(0);
                
            }
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return ep;
    }

    public EntityDireccion obtenerDireccion(long idPerfil) {
        EntityDireccion ed = new EntityDireccion();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");

        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT d FROM EntityDireccion d WHERE d.ep.idPerfil = :idPerfil");
            q = q.setParameter("idPerfil", idPerfil);
            List resultado = q.getResultList();
            if(resultado.size() > 0){
                
                  ed = (EntityDireccion) resultado.remove(0);
                
            }
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return ed;
    }

    public void modificarPerfil(EntityPerfil ep, EntityDireccion ed) {
       try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityPerfil perfil = em.find(domain.Entity.EntityPerfil.class, ep.getIdPerfil());
            EntityDireccion direccion = em.find(domain.Entity.EntityDireccion.class, ed.getIdDireccion());
            perfil.setApellidos(ep.getApellidos());
            perfil.setFechaNac(ep.getFechaNac());
            perfil.setTelefono(ep.getTelefono());
            perfil.setNombre(ep.getNombre());
            
            direccion.setNumero(ed.getNumero());
            direccion.setTipo(ed.getTipo());
            direccion.setNombre(ed.getNombre());
            direccion.setPiso(ed.getPiso());
            direccion.setPais(ed.getPais());
            direccion.setProvincia(ed.getProvincia());
            direccion.setLocalidad(ed.getLocalidad());
            direccion.setCp(ed.getCp());
            
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void trabajarTarea(EntityTareaTrabajada ett, EntityTrabajador etr, EntityTarea et, EntityProyecto ep) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityProyecto proyecto = em.find(domain.Entity.EntityProyecto.class, ep.getIdProyecto());
            EntityTarea tarea = em.find(domain.Entity.EntityTarea.class, et.getIdTarea());
            EntityTrabajador trabajador = em.find(domain.Entity.EntityTrabajador.class, etr.getDni());
            em.persist(ett);
            proyecto.setHoras(ep.getHoras());
            proyecto.setMinutos(ep.getMinutos());
            proyecto.setPorcentaje(ep.getPorcentaje());
            tarea.setHoras(et.getHoras());
            tarea.setMinutos(et.getMinutos());
            tarea.setPorcentaje(et.getPorcentaje());
            trabajador.setHoras(etr.getHoras());
            trabajador.setMinutos(etr.getMinutos());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List obtenerTiempoTrabajadoTarea(EntityTrabajador etr, EntityTarea et) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT ett FROM EntityTareaTrabajada ett WHERE ett.etr = :etr AND ett.et = :et");
            q = q.setParameter("etr", etr);
            q = q.setParameter("et", et);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public List obetenerTareasTrabajadas(EntityTrabajador etr, Date fecha) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT ett FROM EntityTareaTrabajada ett WHERE ett.etr = :etr AND ett.fecha = :fecha");
            q = q.setParameter("etr", etr);
            q = q.setParameter("fecha", fecha);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public List trabajoRealizadoFechas(Date fechaIni,EntityTrabajador trabajador, Date fechaFin) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT ett FROM EntityTareaTrabajada ett WHERE ett.etr = :trabajador AND ett.fecha >= :fechaIni AND ett.fecha <= :fechaFin ");
            q = q.setParameter("trabajador", trabajador);
            q = q.setParameter("fechaIni", fechaIni);
            q = q.setParameter("fechaFin", fechaFin);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPAUsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

   

    
      
     
    }
